1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
import NextAuth, { NextAuthOptions } from "next-auth";
export const authOptions: NextAuthOptions = {
secret: process.env.NEXTAUTH_SECRET,
providers: [
{
id: "AniListProvider",
name: "AniList",
type: "oauth",
token: "https://anilist.co/api/v2/oauth/token",
authorization: {
url: "https://anilist.co/api/v2/oauth/authorize",
params: { scope: "", response_type: "code" },
},
userinfo: {
url: process.env.GRAPHQL_ENDPOINT,
async request(context) {
// console.log(context.tokens.access_token);
const { data } = await fetch("https://graphql.anilist.co", {
method: "POST",
headers: {
"Content-Type": "application/json",
// ...(context.tokens.access_token && {
Authorization: `Bearer ${context.tokens.access_token}`,
// }),
},
body: JSON.stringify({
query: `
query {
Viewer {
id
name
avatar {
large
medium
}
bannerImage
mediaListOptions {
animeList {
customLists
}
}
}
}
`,
}),
}).then((res) => res.json());
const userLists = data.Viewer?.mediaListOptions.animeList.customLists;
let custLists = userLists || [];
if (!userLists?.includes("Watched using Moopa")) {
custLists.push("Watched using Moopa");
const fetchGraphQL = async (
query: string,
variables: { lists: any }
) => {
const response = await fetch("https://graphql.anilist.co/", {
method: "POST",
headers: {
"Content-Type": "application/json",
...(context.tokens.access_token && {
Authorization: `Bearer ${context.tokens.access_token}`,
}),
},
body: JSON.stringify({ query, variables }),
});
return response.json();
};
const customLists = async (lists: any) => {
const setList = `
mutation($lists: [String]){
UpdateUser(animeListOptions: { customLists: $lists }){
id
}
}
`;
const data = await fetchGraphQL(setList, { lists });
return data;
};
await customLists(custLists);
}
return {
token: context.tokens.access_token,
name: data.Viewer.name,
sub: data.Viewer.id,
image: data.Viewer.avatar,
list: data.Viewer?.mediaListOptions.animeList.customLists,
};
},
},
clientId: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
profile(profile) {
return {
token: profile.token,
id: profile.sub,
name: profile?.name,
image: profile.image,
list: profile?.list,
version: "1.0.1",
};
},
},
],
session: {
//Sets the session to use JSON Web Token
strategy: "jwt",
},
callbacks: {
async jwt({ token, user }) {
return { ...token, ...user };
},
async session({ session, token, user }) {
session.user = token;
return session;
},
},
};
export default NextAuth(authOptions);
|